#if 0
fget()函数的返回值是一个file结构体，是与文件描述符fd所对应的文件描述结构体file。结构体file在内核源码中的定义见文件linux-3.19.3/include/linux/fs.h，如下：
struct file {
union {
struct list_head fu_list;
struct rcu_head     fu_rcuhead;
} f_u;
struct path             f_path;
struct inode            *f_inode;
const struct file_operations *f_op;  /*文件的操作函数*/
spinlock_t              f_lock;         /*保护f_ep_links链表的自旋锁*/
atomic_long_t           f_count;        /*文件对象的引用计数器*/
unsigned int            f_flags;        /*当打开文件时所指定的标志*/
fmode_t                         f_mode; /*进程的访问方式*/
struct mutex            f_pos_lock;
loff_t                  f_pos;          /*当前的文件位移量*/
struct fown_struct      f_owner;        /* 通过信号进行I/O事件通知的数据*/
const struct cred       *f_cred;
struct file_ra_state f_ra;              /*文件预读状态*/
u64                     f_version;      /*版本号*/
#ifdef CONFIG_SECURITY
void                    *f_security;   /*指向文件对象的安全结构的指针*/
#endif
void                    *private_data; /*指向特定文件系统或设备驱动程序所需的数据的指针*/
#ifdef CONFIG_EPOLL
struct list_head        f_ep_links;
struct list_head        f_tfile_llink; /*文件的事件轮询等待者链表的头*/
#endif
struct address_space *f_mapping;       /*指向文件地址空间对象的指针*/
}; __attribute__((aligned(4)));

#endif

#include <linux/module.h>
#include <linux/init.h>
#include <linux/file.h>
#include <linux/fs.h>
#include <linux/fs_struct.h>
#include <linux/path.h>
#include <linux/sched.h>
MODULE_LICENSE("GPL");


// [361181.200256] In the first exec: returned value of f_flags is :33794.
// [361181.200259] In the second exec: returned value of f_flags is :33794.



int fget_init(void)
{

	struct file *fs1, *fs2 , *fs3;

// 查找文件描述符为0的文件所对应的file结构体
	fs1=fget(0);
	printk("In the first exec: returned value of f_flags is :%d.\n", fs1->f_flags);
// 查找文件描述符为2的文件所对应的file结构体
	fs2=fget(2);
	printk("In the second exec: returned value of f_flags is :%d.\n", fs2->f_flags);
// 查找文件描述符为1000的文件所对应的file结构体

	fs3=fget(1000);

	if(fs3==NULL)
		printk("There is no file which fd is 1000\n");
	else
		printk("In the third exec: returned value of f_flags is :%d. \n", fs3->f_flags);

	return 0;
}

void fget_exit(void)
{
	printk("Goodbye fget\n");
}

module_init(fget_init);
module_exit(fget_exit);
